package org.wheel.plugins.toolkit.fieldrole;

import cn.hutool.log.Log;
import cn.hutool.log.LogFactory;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.io.support.SpringFactoriesLoader;
import org.wheel.plugins.toolkit.sql.spi.FieldRoleSpi;
import org.wheel.plugins.toolkit.sql.spi.register.FieldRoleRegistry;

import java.util.List;
import java.util.Map;

public class FieldRoleRegistryInitializer  implements ApplicationContextInitializer<ConfigurableApplicationContext> {

    // 直接使用 LogFactory 创建日志对象，Hutool 会自动检测项目中的日志框架（优先级：Slf4j > Log4j > Logback > JDK Logging）
    private static final Log log = LogFactory.get();
    /** 供 AutoConfiguration 调用，可多次执行 */
    public static void init(List<FieldRoleSpi> spiList) {
        log.trace(">>> FieldRoleRegistry 初始化开始，SPI 数量={}", spiList.size());
        // 幂等：先清后写
        FieldRoleRegistry.clear();          // 如果你没提供 clear，就改成 putAll 覆盖
        // 2. 加载
        FieldRoleRegistry.init(spiList);
        // 3. 自己数
        long ruleCount = spiList.stream()
                .map(FieldRoleSpi::loadRoles)
                .mapToLong(Map::size)
                .sum();
        log.trace(">>> FieldRoleRegistry 初始化完成，共 {} 条规则", ruleCount);
    }

    /* ---- ApplicationContextInitializer 入口（刷新前）---- */
    /* ===== 1. 刷新前回调 ===== */
    @Override
    public void initialize(ConfigurableApplicationContext ctx) {
        List<FieldRoleSpi> earlySpi =
                SpringFactoriesLoader.loadFactories(FieldRoleSpi.class, ctx.getClassLoader());
        init(earlySpi);      // 复用同一套逻辑
    }

}
